Skip to content

Update 2025 Interconnection Queue - #15

Open
Yunzhi-Chen wants to merge 73 commits into
mainfrom
yc/interconnectionqueue25
Open

Update 2025 Interconnection Queue#15
Yunzhi-Chen wants to merge 73 commits into
mainfrom
yc/interconnectionqueue25

Conversation

@Yunzhi-Chen

@Yunzhi-Chen Yunzhi-Chen commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Summary

Update interconnection queues to LBNL's 2025 data vintage (LBNL_Ix_Queue_Data_File_thru2025.xlsx), producing interconnection_queues_2025.csv over a 2027–2031 window. Also repoints the county mapping, which was broken against current ReEDS main, and carries two processing bug fixes (isolated and verified in #16).

Prior-vintage outputs are untouched: interconnection_queues_2024.csv, _2023.csv, queue_versions_2024.html, queue_versions_2023.html.

Technical details

Implementation notes

  • Params: version=2026, t_1=2028, t_2=2031 — columns 2027–2031, continuing the +1/vintage pattern (2024 file was 2026–2030).
  • LBNL renamed columns this vintage (IA_status_cleanIA_phase_clean, type1/mw1type_1/mw_1). Added a third branch to the existing version check and rename them back, so the rest of the script is untouched.
  • mw_* now read as object because of the header offset — added a pd.to_numeric cast.
  • ReEDS/inputs/county2zone.csv no longer exists on ReEDS main; the mapping moved to ReEDS/inputs/zones/county_state.csv (same FIPS,county_name,state, 3109 rows). The script did not run without this.
  • reeds_path now reads a REEDS_PATH env var, defaulting to the previous hardcoded path.
  • The version-1 figure is no longer regenerated if it already exists, so a run can't overwrite a prior vintage's figure. Fixed chart 1's x-axis sort to use year_range_version_1.

Bug fixes carried on this branch

Both are detailed and verified against the 2024 input in #16:

  1. Counties matched on name instead of FIPS. LBNL doesn't always use the ReEDS spelling (Acadia Parish vs acadia), so unmatched rows were dropped at the merge — Louisiana lost essentially its entire queue. Now FIPS first with county-name fallback, since LBNL's FIPS are sometimes stale (Oglala Lakota SD) or concatenated for multi-county projects. Unmatched active capacity drops 4.4% → 1.9%, the remainder out of ReEDS scope.
  2. t_2 double-counted the IA Executed queue — built as max(cap_t1, cap_t2) + cap_t1 instead of cap_t1 + cap_t2. t_1 was never affected.

Recovering biomass and pumped-hydro

LBNL folded Pumped Storage into Other Storage and Biofuel/Biomass into Other this vintage. Both are filtered out by the script, so those two tech groups would have disappeared from the output — and ReEDS treats a missing (tg,r) as a 0 limit, which would have blocked all new biomass and PSH builds through 2031.

LBNL sent a supplement with the detailed types behind those aggregated categories for active requests (inputs/queues_other_forNLR_2025.xlsx); add_detailed_types() merges it back in before any other processing:

  • Matched on q_id + entity — a q_id is only unique within an entity.
  • Hybrid requests list their types in a different order than the public file, so each detailed type is matched to the aggregated category it was folded into rather than by position.
  • Capacities always come from the public file; the supplement only relabels.

Recovers 6,841 MW pumped-hydro and 6,320 MW biomass, in line with the 2024 vintage (6,786 / 2,602). All other tech groups are byte-identical to the pre-merge output. LBNL confirmed the supplement can be posted publicly.

Not recovered: compressed air (1,737 MW), waste heat (72 MW) and wave (20 MW) have no ReEDS tech group and stay aggregated. Five supplement records have no match in the public file (~900 MW PSH); the script prints them at runtime.

Figures

2025 interconnection queue (outputs/figures/queue_versions_2025.html):

image

What ReEDS uses today vs. what it will use (outputs/figures/compare_queue_versions.html):

image

Read the 2026 and 2031 bars as constraint presence, not a limit of zero: eq_interconnection_queues is guarded by $(sum{(tgg,rr), cap_limit(tgg,rr,t)}), so a year absent from the csv is unconstrained rather than blocked.

Additional changes

  • README updated: new filename, REEDS_PATH note, supplement merge documented.
  • .gitignore: atb/ (unrelated, carried on this branch).

Relevant sources or documentation

Additional details

What this changes for ReEDS. In every overlapping year the limit tightens by 35–55% (2027 −39%, 2028 −55%, 2029 −41%, 2030 −35%) — a combination of the window shifting a year, the data update, and the two bug fixes. This is the main consequence of the PR.

Needs a paired ReEDS change: interconnection_start in inputs/scalars.csv should go 2025 → 2026 to match the new window. Without it, 2025 and 2026 builds count against the 2027 limit — which matters more than usual given how much that limit tightens.

Output verification: 23,201 rows (1,925 csp + 12 tech groups × 1,773 counties), 2,132 counties, 13 tech groups; no NaNs, no negatives, no duplicate (r,tg), values monotonic across years; all r are valid ReEDS counties; interconnection_queues_2025.csv matches interconnection_queues.csv.

Documentation: README updated. No ReEDS documentation changes needed.

LLM usage: Claude Code — adapting the script to the new column schema, locating the moved county mapping file, the two bug fixes, and the supplement merge for biomass/pumped-hydro.

kennedy-mindermann and others added 30 commits April 30, 2026 17:13
Update AEO preprocessing to pull from AEO2026
This reverts commit c43c67f.
Add natural gas price regression pipeline
Remove highprice and lowprice since AEO 2026 does not have the two scenarios
Update natural gas regression parameters with AEO 2026 data
Fix formatting issues in README.md
@Yunzhi-Chen Yunzhi-Chen self-assigned this Aug 19, 2026
@Yunzhi-Chen
Yunzhi-Chen requested a review from atpham88 August 20, 2026 19:55
@Yunzhi-Chen
Yunzhi-Chen force-pushed the yc/interconnectionqueue25 branch from dfcb62f to 81ccd24 Compare August 24, 2026 17:32
@@ -72,9 +76,19 @@ def insert_rows(group):
if version < 2025:
queue_data_temp = queue_data[['q_status', 'county_'+str(item), 'state', 'IA_status_clean', 'type'+str(item),'mw'+str(item)]]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we get rid of version 2024 and its associated processing script? I think we can just keep two most recent versions.

active_queue_agg = active_queue.groupby(['FIPS','tech','online_year'])['cap'].sum().reset_index()
active_queue_county = county2zone.merge(active_queue_agg, on='FIPS', how='inner')
else:
# Vintages before 2024 report no FIPS code, so fall back to matching on county name and state

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can remove this if we remove 2024 version

queue_data = queue_data[1:]

county2zone = pd.read_csv(os.path.join(reeds_path,'inputs','county2zone.csv'))
county2zone = pd.read_csv(os.path.join(reeds_path,'inputs','zones','county_state.csv'))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the queue data has FIPS now and we don't care about its name or state so can remove this and also any merging with this data, right? I believe I only originally did this because the first version of queue data I worked with did not have FIPS column.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants